package br.com.gbvbahia.mybooks.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import br.com.gbvbahia.commons.dao.InterfaceDAO;
import br.com.gbvbahia.mybooks.dao.contract.DB;
import br.com.gbvbahia.mybooks.modelos.PrateleiraVO;

public class PrateleiraDAO extends InterfaceDAO<PrateleiraVO, String> {
	public static final String PRATELEIRA_TABLE_NAME = "prateleira";
	public static final String[] columns = { "id", "nome", "sincronizado",
			"data_alteracao", "descricao", "publica" };

	public PrateleiraDAO(Context ctx) {
		super(new DB(ctx));
	}

	@Override
	protected String getColumnIdName() {
		return columns[0];
	}

	@Override
	protected String getTableName() {
		return PRATELEIRA_TABLE_NAME;
	}

	@Override
	protected String[] getColumNames() {
		return columns;
	}

	@Override
	protected String getColumnOrderDefault() {
		return columns[1];
	}

	@Override
	protected PrateleiraVO getFromCursor(Cursor cursor) {
		PrateleiraVO toReturn = new PrateleiraVO();
		toReturn.setId(cursor.getString(cursor.getColumnIndex(columns[0])));
		toReturn.setNome(cursor.getString(cursor.getColumnIndex(columns[1])));
		toReturn.setSincronizado(cursor.getInt(cursor
				.getColumnIndex(columns[2])));
		toReturn.setDataAlteracao(Long.parseLong(cursor.getString(cursor
				.getColumnIndex(columns[3]))));
		toReturn.setDescricao(cursor.getString(cursor
				.getColumnIndex(columns[4])));
		toReturn.setPublica(cursor.getInt(cursor.getColumnIndex(columns[5])));
		return toReturn;
	}

	@Override
	protected void populateContentValues(ContentValues cv, PrateleiraVO t) {
		cv.put(columns[0], t.getId());
		cv.put(columns[1], t.getNome());
		cv.put(columns[2], t.getSincronizado());
		cv.put(columns[3], Long.toString(t.getDataAlteracao()));
		cv.put(columns[4], t.getDescricao());
		cv.put(columns[5], t.getPublica());
	}

	/**
	 * Retorna a editora por nome.
	 * 
	 * @param nome
	 * @return
	 */
	public PrateleiraVO getPrateleiraByName(String nome) {
		Cursor cursor = null;
		try {
			cursor = getDataBase().query(PRATELEIRA_TABLE_NAME, columns,
					columns[1] + "=?", new String[] { nome }, null, null, null);
			PrateleiraVO toReturn = null;
			if (cursor.moveToFirst()) {
				toReturn = getFromCursor(cursor);
			}
			return toReturn;
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}

	/**
	 * Retorna as prateleiras por nome.
	 * 
	 * @param name
	 * @return
	 */
	public List<PrateleiraVO> getPateleirasLikeName(String name) {
		Cursor cursor = null;
		try {
			cursor = getDataBase().rawQuery(
					"SELECT * FROM " + PRATELEIRA_TABLE_NAME + " WHERE "
							+ columns[1] + " LIKE ? ;",
					new String[] { "%" + name + "%" });
			List<PrateleiraVO> toReturn = new ArrayList<PrateleiraVO>();
			while (cursor.moveToNext()) {
				toReturn.add(getFromCursor(cursor));
			}
			return toReturn;
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}

	/**
	 * Busca todos os nomes das Prateleiras distintos e ordenados em uma lista.
	 * 
	 * @return
	 */
	public List<String> buscarPrateleirasNomes() {
		Cursor cursor = null;
		try {
			List<String> toReturn = new ArrayList<String>();
			cursor = getDataBase().query(true, PRATELEIRA_TABLE_NAME,
					new String[] { columns[1] }, null, null, null, null,
					columns[1], null);
			while (cursor.moveToNext()) {
				toReturn.add(cursor.getString(0));
			}
			return toReturn;
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}
}